/**
 * 给定有向图，求1到N的最小异或和路径
 * 注意到规模不是很大，
 * 设Dij，当从1到i存在异或和为j的路径则Dij为1，否则为0
 * 初始将令D[1][0]=1，并将(1,0)入队。
 * 然后依次取出头节点，进行计算即可
 * 对于某个队列的头节点(u, w)
 * for u 的所有出边 e，有：
 *     D[e.to][e.w ^ w] = 1
 *     且视情况入队
 * 最后检查D[N]即可
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vll = vector<llt>;

struct _t{
    int u;
    int w;
};

struct edge_t{
    int a;
    int b;
    int w;
};

int N, M;
vector<vector<edge_t>> G;
vector<vector<int>> Flag;
queue<_t> Q;

void work(){
    cin >> N >> M;
    G.assign(N + 1, {});
    for(int a,b,w,i=0;i<M;++i){
        cin >> a >> b >> w;
        G[a].push_back({a, b, w});
    }

    Flag.assign(N + 1, vector<int>(1 << 10, 0));
    Q.push({1, 0});
    while(not Q.empty()){
        auto h = Q.front(); Q.pop();
        for(const auto & e : G[h.u]){
            auto w = e.w ^ h.w;
            if(0 == Flag[e.b][w]){
                Flag[e.b][w] = 1;
                Q.push({e.b, w});
            }
        }
    }
    int ans = -1;
    for(int i=0;i<(1<<10);++i){
        if(1 == Flag[N][i]){
            ans = i;
            break;
        }
    }
    cout << ans << endl;
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}